package io;

import java.io.*;
import java.util.Scanner;

/**
 * @author 徐志荣
 * @date 2023/3/31 11:00
 */

//扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)
public class IODemo9 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //1. 先让用户指定一个要搜索的根目录
        System.out.println("请输入要搜索的根目录:>");
        File rootDir = new File(scanner.next());
        if(!rootDir.isDirectory()){
            System.out.println("输入有误,您输入的目录不存在");
            return;
        }
        //2. 让用户输入一个要查询的词
        System.out.println("请输入要查询的词:>");
        String word  = scanner.next();

        //3. 递归的进行目录/文件的遍历
        scanDir(rootDir,word);
    }

    public static void scanDir(File rootDir, String word) {
        //列出当前的 rootDir 中的内容,没有内容,直接递归结束
        File[] files = rootDir.listFiles();
        if(files == null){
            //当前 rootDir 是一个空目录,这里面啥都没有
            //没必要往里面递归了
            return;
        }
        //目录里由内容,就遍历目录中的每个元素
        for (File f:files) {
            System.out.println("当前搜索到:"+f.getAbsolutePath());
            if(f.isFile()){
                //打开文件,读取内容,比较看看是否包含上述关键词
                String content = readFile(f);
                if(content.contains(word)){
                    System.out.println(f.getAbsolutePath()+"包含关键字!");
                }
            }else if(f.isDirectory()){
                //进行递归操作
                scanDir(f,word);
            }else {
                //不是普通文件,也不是目录文件,直接跳过
                continue;
            }
        }
    }

    //直接一个字符一个字符的读出来,然后拼装就可以
    public static String readFile(File f) {
        //读取文件的整个内容,返回回来
        //使用字符流来读取,由于咱们匹配的是字符串,此处只能按照字符流处理,才是有意义的!
        StringBuffer stringBuffer = new StringBuffer();
        try(Reader reader = new FileReader(f)){
            //一次读一个字符,把读到的结果 拼装到 StringBuilder 中,统一转成 String
            while (true){
                int c = reader.read();
                if(c == -1){
                    break;
                }
                stringBuffer.append((char) c);
            }
        }  catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuffer.toString();
    }
}
